home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 005 / ecstat.arc / ECSTAT1.BAS < prev    next >
Encoding:
BASIC Source File  |  1986-11-07  |  23.3 KB  |  584 lines

  1. 100 KEY OFF: GOTO 1000
  2. 200 REM -MACHINE SPECIFIC PARAMETERS SET HERE
  3. 210 REM SCREEN NUMBER FOR HIGH RES
  4. 220 HRES%=2 'IBM PC
  5. 230 REM PIXEL BOUNDARIES FOR HRES SCREEN
  6. 240 BOT%=199 : SRIGHT%=639
  7. 245 REM ADVANCE TO NEW PAGE CHAR
  8. 250 PADV%=140 'EPSON
  9. 260 BOT%=BOT%-17: SL%=BOT%+13: TOP%=12 : SLEFT%=32: SRIGHT%=SRIGHT%-32
  10. 290 RETURN
  11. 300 CLS: LOCATE 6,35 : PRINT "ECSTAT(tm)"
  12. 305 LOCATE 7,35: PRINT "Version 1.1"
  13. 310 LOCATE  9,31 : PRINT "by ROBERT S DOHNER"
  14. 320 LOCATE 10,34 : PRINT "FLETCHER SCHOOL"
  15. 330 LOCATE 11,34 : PRINT "TUFTS UNIVERSITY"
  16. 340 LOCATE 12,34 : PRINT "MEDFORD, MA 02155"
  17. 350 LOCATE 15,20 : PRINT "Copyright (C) 1984   All rights reserved"
  18. 352 LOCATE 20,1 : PRINT "This program is distributed as User-Supported Software.  If you"
  19. 354 LOCATE 21,1 : PRINT "find this program useful, a contribution of $25 is requested." : GOSUB 19030
  20. 360 RETURN
  21. 1000 DEFINT I-N : JX=0 : IX=JX : K=JX : F#=0 : R#=F# : RHO=0 : SUM#=F#
  22. 1002 YSS#=F# : YBAR#=F#
  23. 1004 N2=K : N1=K : L1=K
  24. 1005 DIM NSMPL(21) : J=K : I=K
  25. 1010 NFCN=6 : DIM FCN$(NFCN)
  26. 1020 DATA LOG,EXP,SQR,ABS,SIN,COS,TAN
  27. 1030 FOR I=0 TO NFCN : READ FCN$(I) : NEXT I
  28. 1035 DIM IH(5)
  29. 1040 FIRSTIME%=-1 : DISKFILE%=0
  30. 1050 GOSUB 12000
  31. 1500 DEFINT I-N: ON ERROR GOTO 18000: GOTO 2210
  32. 2000 CLS
  33. 2010 PRINT "1   CATALOG DATA IN MEMORY" TAB(50) "ECSTAT COMMANDS"
  34. 2015 PRINT "2   CATALOG FILES ON DISK"
  35. 2020 PRINT "3   DISPLAY DATA"
  36. 2025 PRINT "4   PRINT DATA"
  37. 2030 PRINT "5   ENTER DATA"
  38. 2040 PRINT "6   EDIT DATA"
  39. 2050 PRINT "7   ";SDATA$
  40. 2060 PRINT "8   ";RDATA$
  41. 2062 PRINT "9   CHANGE SAMPLE RANGE"
  42. 2064 PRINT "10  COMPUTE A NEW VARIABLE"
  43. 2070 PRINT "11  ";MVC$
  44. 2090 PRINT "12  ";OLS$;" REGRESSION"
  45. 2092 PRINT "13  ";CO$
  46. 2093 PRINT "14  ";TSLS$
  47. 2094 PRINT "15  ";OSF$
  48. 2095 PRINT "16  ";OANDI$
  49. 2096 PRINT "17  SCATTER PLOT"
  50. 2098 PRINT "18  TIME PLOT"
  51. 2100 PRINT "19  LOAD DATA FROM AN ASCII FILE"
  52. 2103 PRINT "20  HOUSEKEEPING OPERATIONS"
  53. 2105 PRINT "21  RESTART PROGRAM"
  54. 2110 PRINT "22  EXIT PROGRAM"
  55. 2120 PRINT
  56. 2130 INPUT "ENTER DESIRED SERVICE (1-22) >",ANSWER
  57. 2140 ANSW%=ANSWER
  58. 2150 IF ANSW%=ANSWER AND ANSW%>=1 AND ANSW%<=22 THEN 2200
  59. 2160 PRINT "RESPONSE REQUIRES AN INTEGER BETWEEN 1 AND 22"
  60. 2170 GOSUB 19030:GOTO 2000
  61. 2200 ON ANSW% GOTO 2210,2210,2210,2210,2210,2210,2210,2210,2500,2500,2500,2500,2500,2500,2500,2500,2500,2500,2210,2210,2210,2210
  62. 2210 ON ANSW% GOSUB 3000,3100,4000,4010,5000,6000,7000,8000,20000,3080,9000,11000,26000,28000,27000,29000,25000,25300,8300,3200,13000,14000
  63. 2300 REM RETURN HERE AFTER PERFORMING SERVICE
  64. 2400 GOTO 2000
  65. 2500 CHAIN "ECSTAT2.BAS",1000,ALL
  66. 3000 REM DATA CATALOG
  67. 3005 LP%=0
  68. 3010 CLS
  69. 3020 PRINT "NUMBER OF OBSERVATIONS PER VARIABLE: ";NUMOBS
  70. 3025 IF LP% THEN LPRINT "NUMBER OF OBSERVATIONS PER VARIABLE: ";NUMOBS
  71. 3030 PRINT "NUMBER OF DEFINED VARIABLES: ";NUMVAR
  72. 3035 IF LP% THEN LPRINT "NUMBER OF DEFINED VARIABLES: ";NUMVAR
  73. 3040 PRINT "NUMBER OF REMAINING VARIABLES: ";MAXVAR-NUMVAR: PRINT
  74. 3042 IF LP% THEN LPRINT "NUMBER OF REMAINING VARIABLES: ";MAXVAR-NUMVAR: LPRINT
  75. 3048 GOSUB 24800
  76. 3049 PRINT: IF LP% THEN LPRINT
  77. 3050 PRINT "DEFINED VARIABLES ARE:" : PRINT
  78. 3055 IF LP% THEN LPRINT "DEFINED VARIABLES ARE:" : LPRINT
  79. 3060 FOR I=0 TO NUMVAR-1
  80. 3062  PRINT NAMES$(I),
  81. 3064  IF LP% THEN LPRINT NAMES$(I),
  82. 3066 NEXT I
  83. 3070 GOSUB 19100
  84. 3080 IF LP% OR SCR% THEN 3010 ELSE RETURN
  85. 3100 REM DISK CATALOG
  86. 3110 CLS : S$=" "
  87. 3120 PRINT "CATALOG FILES ON DISK" : PRINT
  88. 3130 INPUT "WHICH DRIVE (A or B)?> ",ANSWER$ : IF ANSWER$="" THEN RETURN
  89. 3140 LSET S$=ANSWER$ : N=ASC(S$) : IF (N<65) AND (N>72) THEN 3110
  90. 3142 CLS : PRINT : PRINT "FILES ON DRIVE ";S$ : PRINT
  91. 3145 PRINT : FILES S$+":*.*": IF T$="?" THEN RETURN
  92. 3150 GOSUB 19000: RETURN
  93. 3200 CLS: PRINT "HOUSEKEEPING OPERATIONS"
  94. 3210 PRINT "1   RENAME A VARIABLE"
  95. 3220 PRINT "2   DELETE VARIABLE(S)"
  96. 3230 PRINT "3   EXTEND DATA RANGE"
  97. 3235 PRINT "4   ADD DATA FROM A DISK FILE"
  98. 3240 PRINT "5   RETURN TO MAIN MENU" : PRINT
  99. 3250 INPUT "ENTER DESIRED SERVICE (1-5) >",ANSWER
  100. 3260 ANSW%=ANSWER
  101. 3270 IF ANSW%>=1 AND ANSW%<=5 AND ANSW%=ANSWER THEN 3300
  102. 3280 PRINT "RESPONSE REQUIRES INTEGER BETWEEN 1 AND 5"
  103. 3290 GOSUB 19030 : GOTO 3200
  104. 3300 IF ANSW%=5 THEN RETURN
  105. 3310 ON ANSW% GOSUB 3350,3450,3600,8700
  106. 3320 RETURN
  107. 3350 CLS: PRINT "RENAME VARIABLE" : PRINT
  108. 3360 NEWNAMES=FALSE% : GOSUB 3800
  109. 3370 INPUT "CURRENT NAME >",NAMEIS$
  110. 3380 IF NAMEIS$="" THEN RETURN ELSE GOSUB 16100
  111. 3390 INPUT "NEW NAME >",NAMEIS$
  112. 3400 IF NAMEIS$="" THEN RETURN
  113. 3410 NAMES$(LISTV(0))=NAMEIS$ : PRINT
  114. 3420 PRINT "NEXT VARIABLE OR ";RMM$ : GOTO 3370
  115. 3450 NEWNAMES=FALSE%: MAXNAMES=NUMVAR-1: NAMEERR=FALSE%: R#=0
  116. 3460 CLS: PRINT "DELETE VARIABLES" : PRINT
  117. 3465 GOSUB 3800
  118. 3470 PRINT: LISTLEN=0 : GOSUB 16510
  119. 3480 IF NAMEERR THEN RETURN
  120. 3490 FOR I=0 TO L1
  121. 3500  LVAR=NUMVAR-1 : K=LISTV(I) : IF K=0 THEN 3560 ELSE IF K=LVAR THEN 3550
  122. 3510  FOR J=0 TO NUMOBS-1
  123. 3520   X#(J,K)=X#(J,LVAR): X#(J,LVAR)=R#
  124. 3530  NEXT J
  125. 3540  NAMES$(K)=NAMES$(LVAR)
  126. 3550  NUMVAR=NUMVAR-1
  127. 3560 NEXT I
  128. 3570 RETURN
  129. 3600 ER%=TRUE%
  130. 3610 PRINT "LAST OBSERVATION IS NOW ";NUMOBS
  131. 3620 INPUT "ENTER NEW VALUE FOR LAST OBSERVATION >",ANSWER$
  132. 3630 IF ANSWER$="" THEN RETURN
  133. 3640 ANSWER=VAL(ANSWER$) : NEWOBS=ANSWER
  134. 3650 IF NEWOBS<=0 OR NEWOBS<>ANSWER THEN PRINT "MUST BE POSITIVE INTEGER" : GOTO 3620
  135. 3660 FILENAME$="XTEND$$.DAT" : GOSUB 7065
  136. 3670 SWAP NOBS,NUMOBS : NOBS=NEWOBS : ERASE XPX#,XPXI#,XBAR#,BETA#
  137. 3680 GOSUB 12500
  138. 3690 OPEN FILENAME$ FOR INPUT AS #1
  139. 3700 INPUT#1,J,NUMVAR,NOBS
  140. 3705 IF MAXVAR<NUMVAR+1 THEN NEWOBS=NOBS: PRINT "TOO MANY OBSERVATIONS": GOSUB 19030:GOSUB 12500
  141. 3710 GOSUB 8100
  142. 3715 CLOSE#1 : KILL FILENAME$
  143. 3720 FOR J=0 TO NEWOBS-1 : X#(J,0)=1! : NEXT J
  144. 3750 ER%=FALSE : NOBS=NUMOBS : NUMOBS=NEWOBS : RETURN
  145. 3800 PRINT "DEFINED VARIABLES ARE:"
  146. 3810 FOR I=0 TO NUMVAR-1 : PRINT NAMES$(I),:NEXT I
  147. 3820 PRINT : PRINT : RETURN
  148. 4000 IF LP%=0 GOTO 4020
  149. 4010 LP%=1
  150. 4020 CLS
  151. 4030 PRINT "DATA IN ONE OR MORE VARIABLES MAY BE ";
  152. 4032 IF LP%=1 THEN PRINT "PRINTED" ELSE PRINT "DISPLAYED"
  153. 4040 MAXNAMES=NUMVAR:NEWNAMES=FALSE%:FORCE0%=FALSE%
  154. 4050 GOSUB 16000:IF NAMEERR THEN RETURN
  155. 4071 IF LISTLEN=0 THEN RETURN
  156. 4080 FIRSTVAR=0:LASTVAR=3:FIRSTOB=0:LASTOB=19 : IF LP% THEN LASTOB=59
  157. 4090 IF LASTVAR>LISTLEN-1 THEN LASTVAR=LISTLEN-1
  158. 4100 IF LASTOB>NUMOBS-1 THEN LASTOB=NUMOBS-1
  159. 4110 CLS
  160. 4120 PRINT "OBSERVATION   ";
  161. 4125 IF LP% THEN LPRINT "OBSERVATION   ";
  162. 4130   FOR I=FIRSTVAR TO LASTVAR
  163. 4140   PRINT USING "\            \";PRNAM$(I);
  164. 4145   IF LP% THEN LPRINT USING "\            \";PRNAM$(I);
  165. 4150   NEXT I
  166. 4160 PRINT : IF LP% THEN LPRINT
  167. 4170 FOR I=FIRSTOB TO LASTOB
  168. 4180   PRINT I+1, : IF LP% THEN LPRINT I+1,
  169. 4190     FOR J=FIRSTVAR TO LASTVAR: XB=X#(I,LISTV(J))
  170. 4200     PRINT XB,
  171. 4205     IF LP% THEN LPRINT XB,
  172. 4210     NEXT J
  173. 4220   PRINT : IF LP% THEN LPRINT
  174. 4230 NEXT I
  175. 4240 REM ONE SCREENFUL IS PRINTED
  176. 4250 PRINT : IF LP% THEN LPRINT
  177. 4260 IF NOT LP% THEN GOSUB 19030
  178. 4270 IF LASTVAR=LISTLEN-1 AND LASTOB=NUMOBS-1 THEN GOTO 4340
  179. 4280 IF LASTOB=NUMOBS-1 THEN 4300
  180. 4290 FIRSTOB=LASTOB+1:LASTOB=FIRSTOB+19
  181. 4295 IF NOT LP% THEN GOTO 4100 ELSE LASTOB=FIRSTOB+59:LPRINT CHR$(PADV%):GOTO 4100
  182. 4300 REM NEXT SET OF VARIABLES
  183. 4310 FIRSTVAR=LASTVAR+1:LASTVAR=FIRSTVAR+3
  184. 4320 FIRSTOB=0:LASTOB=19:IF LP% THEN LPRINT CHR$(140)
  185. 4330 GOTO 4090
  186. 4340 IF LP% THEN LPRINT CHR$(PADV%) : LP%=0
  187. 4350 RETURN
  188. 5000 REM
  189. 5010 REM ENTER DATA
  190. 5020 CLS
  191. 5030 PRINT "ENTER DATA FOR NEW VARIABLES":PRINT
  192. 5040 MAXNAMES=MAXVAR-NUMVAR:NEWNAMES=TRUE%:FORCE0%=FALSE%
  193. 5050 GOSUB 16000:IF NAMEERR THEN RETURN
  194. 5055 REM VARIABLE IN LISTV(0)
  195. 5060 PRINT:PRINT "ENTER DATA - (<ENTER> ALONE MEANS 0)": PRINT
  196. 5070 I=0:J=I
  197. 5080 S$=" " : PRINT NAMES$(LISTV(J));"(";I+1;")" TAB(20) ">";
  198. 5090 INPUT "",ANSWER$ : LSET S$=ANSWER$
  199. 5100 IF S$=" " THEN 5140 ELSE IF S$="E" THEN RETURN ELSE IF S$<>"B" THEN 5130
  200. 5110 IF J>0 THEN J=J-1 ELSE IF I>0 THEN J=L1 : I=I-1
  201. 5120 GOTO 5080
  202. 5130 X#(I,LISTV(J))=VAL(ANSWER$)
  203. 5140 J=J+1 : IF J>L1 THEN J=0 : I=I+1 : IF L1 THEN PRINT
  204. 5150 IF I>=NUMOBS THEN RETURN ELSE 5080
  205. 6000 REM
  206. 6010 REM EDIT DATA
  207. 6020 CLS
  208. 6030 PRINT "ENTER NAME OF VARIABLE TO BE EDITED"
  209. 6040 MAXNAMES=1:NEWNAMES=FALSE%:FORCE0%=FALSE%
  210. 6050 GOSUB 16000:IF NAMEERR THEN RETURN
  211. 6060 REM VARIABLE IN LISTV(0)
  212. 6070 LVAR=LISTV(0)
  213. 6080 CLS: ANSW%=0
  214. 6090 PRINT:PRINT "EDITING: ";NAMES$(LVAR):PRINT "OBSERVATION NUMBER TO BE CHANGED"
  215. 6100 PRINT RMM$; : INPUT "> ",ANSWER$
  216. 6110 IF ANSWER$="" THEN RETURN
  217. 6115 IF MID$(ANSWER$,1,1)="N" THEN ANSW%=ANSW%+1 : GOTO 6160
  218. 6120 ANSWER=VAL(ANSWER$):ANSW%=ANSWER
  219. 6130 IF ANSWER=ANSW% AND ANSW%>0 AND ANSW%<=NUMOBS THEN 6160
  220. 6140 PRINT "OBSERVATION MUST BE INTEGER BETWEEN 1 AND ";NUMOBS
  221. 6150 GOTO 6090
  222. 6160 PRINT:PRINT NAMES$(LVAR);"( ";ANSW%;") = ";X#(ANSW%-1,LVAR);
  223. 6170 S$=" " : INPUT "NEW VALUE?> ",ANSWER$ : IF ANSWER$="" THEN GOTO 6090
  224. 6172 LSET S$=ANSWER$
  225. 6174 IF S$="I" THEN GOSUB 6300
  226. 6175 IF S$="D" THEN GOSUB 6400 : GOTO 6090
  227. 6178 ANSWER=VAL(ANSWER$)
  228. 6180 PRINT NAMES$(LVAR);"( ";ANSW%;") WAS ";X#(ANSW%-1,LVAR);
  229. 6190 PRINT " IS NOW ";ANSWER
  230. 6200 X#(ANSW%-1,LVAR)=ANSWER
  231. 6210 GOTO 6090
  232. 6300 FOR I=NUMOBS-1 TO ANSW% STEP -1
  233. 6310 X#(I,LVAR)=X#(I-1,LVAR)
  234. 6320 NEXT I
  235. 6330 PRINT : INPUT "INSERTED VALUE >",ANSWER$ : RETURN
  236. 6400 IF ANSW%=NUMOBS THEN 6440
  237. 6405 XB=X#(ANSW%-1,LVAR)
  238. 6410 FOR I=ANSW%-1 TO NUMOBS-2
  239. 6420 X#(I,LVAR)=X#(I+1,LVAR)
  240. 6430 NEXT I
  241. 6440 X#(NUMOBS-1,LVAR)=0!
  242. 6450 PRINT NAMES$(LVAR);"( ";ANSW%;") WAS ";XB;
  243. 6460 PRINT " IS NOW ";X#(ANSW%-1,LVAR) : RETURN
  244. 7000 REM
  245. 7050 CLS
  246. 7055 PRINT SDATA$:PRINT
  247. 7060 INPUT "ENTER DISK FILE NAME> ",FILENAME$: IF FILENAME$="" THEN RETURN
  248. 7065 NAME FILENAME$ AS FILENAME$
  249. 7070 OPEN FILENAME$ FOR OUTPUT AS #1
  250. 7080 WRITE#1,MAXVAR,NUMVAR-1,NUMOBS
  251. 7090 FOR I=1 TO NUMVAR-1:WRITE#1,NAMES$(I):NEXT I
  252. 7100   FOR I=1 TO NUMVAR-1
  253. 7110     FOR J=0 TO NUMOBS-1
  254. 7120     WRITE#1,X#(J,I)
  255. 7130   NEXT J,I
  256. 7140 CLOSE #1 : IF ER% THEN RETURN
  257. 7150 PRINT "DATA FILED IN ";FILENAME$
  258. 7160 GOSUB 19000:RETURN
  259. 8000 REM
  260. 8010 REM RETRIEVE DATA FROM DISK FILE
  261. 8020 CLS: S$=" "
  262. 8025 PRINT RDATA$:PRINT
  263. 8030 INPUT "ENTER DISK FILE NAME> ",FILENAME$: IF FILENAME$="" THEN RETURN
  264. 8032 T$=" ": LSET T$=FILENAME$: IF T$="?" THEN GOSUB 3120: PRINT: GOTO 8025
  265. 8040 OPEN FILENAME$ FOR INPUT AS #1
  266. 8050 INPUT#1,MAXVAR,NUMVAR,NUMOBS
  267. 8052 IF MAXVAR<=0 OR NUMVAR<=0 OR NUMOBS<=0 OR MAXVAR<NUMVAR THEN GOSUB 8900: RETURN
  268. 8055 NOBS=NUMOBS : NSMPL(1)=0 : NSMPL(2)=NOBS-1 : NR2=2
  269. 8060 DISKFILE%=TRUE%
  270. 8090 GOSUB 12000
  271. 8100 FOR I=1 TO NUMVAR:INPUT#1,NAMES$(I):NEXT I
  272. 8110   FOR I=1 TO NUMVAR
  273. 8120     FOR J=0 TO NOBS-1
  274. 8130     INPUT#1,X#(J,I)
  275. 8140   NEXT J,I
  276. 8153 FOR J=0 TO NUMOBS-1: X#(J,0)=1! : NEXT J
  277. 8155 NAMES$(0)="CONST" : NUMVAR=NUMVAR+1
  278. 8157 IF ER% THEN RETURN
  279. 8160 PRINT "DATA RETRIEVED FROM ";FILENAME$
  280. 8170 CLOSE#1 : GOSUB 19000:RETURN
  281. 8300 REM  ROUTINE TO LOAD DATA FROM ASCII FILE
  282. 8310 CLS: INPUT "NAME OF FILE CONTAINING DATA ",FILENAME$ : IF FILENAME$="" THEN RETURN
  283. 8320 PRINT : INPUT "NUMBER OF OBSERVATIONS ",NUMOBS
  284. 8330 PRINT : INPUT "NUMBER OF VARIABLES ",NUMVAR
  285. 8335 S$=" ": DISKFILE%=TRUE% : NOBS=NUMOBS: GOSUB 12500
  286. 8337 IF NOBSERR THEN RETURN
  287. 8340 OPEN FILENAME$ FOR INPUT AS #1
  288. 8350 PRINT : INPUT "ARE VARIABLE NAMES GIVEN IN FIRST LINE OF FILE? (Y/N) ",ANSWER$
  289. 8355 LSET S$=ANSWER$ : IF S$="N" OR S$="n" THEN 8420 ELSE IF S$<>"Y" AND S$<>"y"THEN 8350
  290. 8360 INPUT#1,ANSWER$ : IF ANSWER$="" THEN 8360
  291. 8362 S$=" " : ANSWER$=ANSWER$+S$ : N1=1 : L=LEN(ANSWER$): I=0
  292. 8365 IF N1=L THEN GOTO 8470
  293. 8370 IF MID$(ANSWER$,N1,1)=S$ THEN N1=N1+1 : GOTO 8365
  294. 8375 N2=INSTR(N1,ANSWER$,S$) : I=I+1 : NAMES$(I)=MID$(ANSWER$,N1,N2-N1)
  295. 8380 IF N2<L THEN N1=N2+1 : GOTO 8365
  296. 8385 GOTO 8470
  297. 8420 PRINT : PRINT "ENTER NAMES OF VARIABLES IN ORDER AT PROMPTS" : PRINT
  298. 8430 FOR I=1 TO NUMVAR
  299. 8440  PRINT "VARIABLE ";I; : INPUT "  ",NAMES$(I)
  300. 8445 NEXT I
  301. 8450 NBLANKS=0: S$=" "
  302. 8453 INPUT#1,ANSWER$: LSET S$=ANSWER$: IF S$=" " THEN NBLANKS=NBLANKS+1: GOTO 8453
  303. 8456 CLOSE#1: OPEN FILENAME$ FOR INPUT AS #1: IF NBLANKS=0 THEN 8470
  304. 8459 FOR I=1 TO NBLANKS: INPUT#1,ANSWER$: NEXT I
  305. 8470 NUMVAR=NUMVAR+1
  306. 8480 PRINT : INPUT "DATA ARRANGED BY  1)OBSERVATION  2) VARIABLE ? ",J
  307. 8490 IF J<>1 AND J<>2 THEN 8480
  308. 8500 IF J=2 THEN 8550
  309. 8510 FOR I=0 TO NUMOBS-1
  310. 8520  FOR J=1 TO NUMVAR-1
  311. 8525   IF EOF(1) THEN 8600
  312. 8530   INPUT#1,X#(I,J)
  313. 8540 NEXT J : NEXT I : CLOSE#1 : RETURN
  314. 8550 FOR J=1 TO NUMVAR-1
  315. 8560  FOR I=0 TO NUMOBS-1
  316. 8565   IF EOF(1) THEN 8600
  317. 8570   INPUT#1,X#(I,J)
  318. 8580 NEXT I : NEXT J : CLOSE#1 : RETURN
  319. 8600 CLOSE#1: PRINT "INPUT PAST END OF DATA": GOSUB 19030: RETURN
  320. 8700 CLS: PRINT "ADD DATA FROM DISK FILE"
  321. 8710 PRINT "WARNING: PROGRAM ASSUMES OBSERVATION NUMBERS CORRESPOND":PRINT
  322. 8720 INPUT "ENTER DISK FILE NAME> ",FILENAME$: IF FILENAME$="" THEN RETURN
  323. 8730 OPEN FILENAME$ FOR INPUT AS #1
  324. 8740 INPUT#1, J,IX,JX
  325. 8745 IF J<=0 OR IX<=0 OR JX<=0 OR J<IX THEN GOSUB 8900: RETURN
  326. 8750 IF NUMVAR+IX>MAXVAR THEN PRINT "TOO MANY VARIABLES":GOSUB 19030:RETURN
  327. 8760 K=JX: IF NUMOBS<K THEN K=NUMOBS
  328. 8770 K=K-1: JX=JX-1: IX=NUMVAR+IX-1
  329. 8780 FOR I=NUMVAR TO IX: INPUT#1,NAMES$(I): NEXT I
  330. 8790 FOR I=NUMVAR TO IX
  331. 8800  FOR J=0 TO K
  332. 8810   INPUT#1,X#(J,I)
  333. 8820  NEXT J
  334. 8830  IF K=JX THEN 8850
  335. 8840  FOR J=K+1 TO JX: INPUT#1,XB: NEXT J
  336. 8850 NEXT I: NUMVAR=IX+1
  337. 8855 PRINT "DATA RETRIEVED FROM ";FILENAME$: GOSUB 19000
  338. 8860 CLOSE#1: RETURN
  339. 8900 CLOSE#1: PRINT "DATA FILE NOT CREATED BY ECSTAT"
  340. 8910 GOSUB 19000: RETURN
  341. 12000 REM
  342. 12010 REM ALLOCATE STORAGE AND INITIALIZE PROGRAM
  343. 12020 IF NOT FIRSTIME% THEN 12420
  344. 12030 OLS$="ORDINARY LEAST SQUARES": SDATA$="SAVE DATA TO DISK"
  345. 12032 CO$="REGRESSION - AUTOCORRELATION": RDATA$="RETRIEVE DATA FROM DISK"
  346. 12034 MVC$="MEANS, VARIANCES, AND CORRELATIONS":TSLS$="TWO STAGE LEAST SQUARES"
  347. 12036 OSF$="OUT OF SAMPLE REGRESSION FIT": OANDI$="OUTLIERS AND INFLUENCE"
  348. 12040 COR%=0 : PTA$=" PLEASE TRY AGAIN" : DP%=0 : SP22$=SPACE$(22)
  349. 12045 ON ERROR GOTO 18000 : RMM$="<ENTER> ALONE RETURNS TO MAIN MENU "
  350. 12046 AYS$="ARE YOU SURE YOU WANT TO " : IFNOT$="IF YOU HAVE NOT STORED YOUR DATA YOU WILL LOSE IT"
  351. 12050 TRUE%=-1:FALSE%=0
  352. 12060 FIRSTIME%=FALSE%:WASFIRST%=TRUE%
  353. 12070 GOSUB 200
  354. 12080 GOSUB 300
  355. 12095 CLS
  356. 12100 PRINT "DO YOU WISH TO LOAD DATA FROM A DISK FILE (Y/N)?>";
  357. 12110 INPUT "",ANSWER$
  358. 12120 IF ANSWER$="Y" OR ANSWER$="y" THEN GOSUB 8000:GOTO 12410
  359. 12125 IF ANSWER$<>"N" AND ANSWER$<>"n" THEN CLS : GOTO 12100
  360. 12130 INPUT "NUMBER OF OBSERVATIONS>";ANSWER$
  361. 12140 IF ANSWER$="" THEN RETURN
  362. 12150 ANSWER=VAL(ANSWER$)
  363. 12160 ANSW%=ANSWER
  364. 12170 IF (ANSW%=ANSWER) AND (ANSW%>0) THEN 12210
  365. 12180 PRINT "POSITIVE INTEGER REQUIRED"
  366. 12190 PRINT RMM$ : PRINT
  367. 12200 GOTO 12100
  368. 12210 NUMOBS=ANSW% : NOBS=NUMOBS : NSMPL(1)=0 : NSMPL(2)=NOBS-1 : NR2=2
  369. 12220 GOSUB 12500
  370. 12230 IF NOBSERR THEN NOBSERR=FALSE%: CLS: GOTO 12130
  371. 12400 NUMVAR=1
  372. 12410 IF NOT WASFIRST% THEN RETURN
  373. 12415 GOTO 2000 'FAKE RETURN, GOSUB WIPED OUT BY CLEAR
  374. 12420 REM NOT THE FIRST TIME INITIALIZED
  375. 12430 ERASE X#,NAMES$,LAG,LAGR,RESID#,SRESID,LISTV,LISTRV,PRNAM$,Y#,YS#,IND
  376. 12440 IF NOT DISKFILE% THEN 12095
  377. 12450 K1=MAXVAR-1:N1=NUMOBS-1
  378. 12460 ERASE NAMES$,X#,LAG,LAGR,RESID#,SRESID,LISTV,LISTRV,PRNAM$,Y#,YS#,IND
  379. 12465 DIM NAMES$(K1),X#(N1,K1),LAG(K1),LAGR(K1),RESID#(N1),LISTV(K1),PRNAM$(K1)
  380. 12466 DIM SRESID(N1),LISTRV(K1),Y#(K1),YS#(K1),IND(K1)
  381. 12470 RETURN
  382. 12500 NSMPL(1)=0: NSMPL(2)=NOBS-1: NR2=2
  383. 12505 ERASE X#,NAMES$,LAG,LAGR,RESID#,SRESID,LISTV,LISTRV,PRNAM$,Y#,YS#,IND
  384. 12510 K=INT((20500/NOBS -12)/(8+12/NOBS))
  385. 12520 IF K<20 THEN J=28000-K*(16*K+52): K=INT((J/NOBS-12)/(8+12/NOBS))
  386. 12550 MAXVAR=K: NOBSERR=FALSE%
  387. 12560 IF MAXVAR<=1 THEN PRINT "TOO MANY OBSERVATIONS": NOBSERR=TRUE%: GOSUB 19030: RETURN
  388. 12570 K1=K-1:N1=NOBS-1
  389. 12580 DIM NAMES$(K1),X#(N1,K1),LAG(K1),LAGR(K1),RESID#(N1),LISTV(K1),PRNAM$(K1)
  390. 12585 DIM SRESID(N1),LISTRV(K1),Y#(K1),YS#(K1),IND(K1)
  391. 12590 NAMES$(0)="CONST"
  392. 12595 FOR I=0 TO N1:X#(I,0)=1!:NEXT I: RETURN
  393. 13000 REM
  394. 13010 REM RESTART PROGRAM
  395. 13020 PRINT IFNOT$ : PRINT AYS$; : INPUT "START OVER? (Y/N)>",ANSWER$
  396. 13030 IF ANSWER$="Y" OR ANSWER$="y" THEN 13080 ELSE RETURN
  397. 13080 FIRSTIME%=FALSE%:DISKFILE%=FALSE%
  398. 13090 GOSUB 12000
  399. 13100 RETURN
  400. 14000 REM
  401. 14010 REM EXIT PROGRAM
  402. 14015 PRINT IFNOT$
  403. 14020 PRINT AYS$; : INPUT "TO EXIT? (Y/N)>",ANSWER$
  404. 14030 IF ANSWER$="y" OR ANSWER$="Y" THEN SYSTEM
  405. 14040 RETURN
  406. 15000 REM
  407. 15070 IF NUMVAR<MAXVAR THEN 15100
  408. 15080 PRINT "SYMBOL TABLE FULL! NO NEW VARIABLES" : GOSUB 19050
  409. 15090 NAMEERR=TRUE%:RETURN
  410. 15100 FOUNDIT%=FALSE%
  411. 15110   FOR I=0 TO NUMVAR-1
  412. 15120   IF NAMEIS$=NAMES$(I) THEN FOUNDIT%=TRUE%
  413. 15130   NEXT I
  414. 15140 IF NOT FOUNDIT% THEN 15170
  415. 15150 PRINT CHR$(34);NAMEIS$;CHR$(34);" ALREADY DEFINED - NOT A NEW NAME"
  416. 15155 GOSUB 19000
  417. 15160 NAMEERR=TRUE%:RETURN
  418. 15170 NAMELOC=NUMVAR
  419. 15180 NUMVAR=NUMVAR+1
  420. 15190 NAMES$(NAMELOC)=NAMEIS$
  421. 15200 RETURN
  422. 16000 REM
  423. 16010 REM COLLECT A LIST OF NAMES AND RETURN LOCATIONS IN LISTV
  424. 16020 REM A SINGLE NAME IS A SPECIAL CASE
  425. 16030 NAMEERR=FALSE%
  426. 16040 IF MAXNAMES>1 THEN 16500
  427. 16050 INPUT "VARIABLE NAME IS?> ",NAMEIS$
  428. 16060 IF NAMEIS$="" THEN NAMEERR=TRUE%:RETURN
  429. 16070 IF NOT NEWNAMES THEN 16100
  430. 16080 GOSUB 15000
  431. 16090 IF NAMEERR THEN RETURN ELSE 16180
  432. 16100 NAMELOC=-1
  433. 16110   FOR I=0 TO NUMVAR-1
  434. 16120   IF NAMES$(I)=NAMEIS$ THEN NAMELOC=I
  435. 16130   NEXT I
  436. 16140 IF NAMELOC<>-1 THEN 16180
  437. 16150 PRINT CHR$(34);NAMEIS$;CHR$(34);" NOT DEFINED"
  438. 16160 PRINT "RE-ENTER NAME OR <ENTER> TO RETURN TO COMMAND MENU"
  439. 16170 GOTO 16050
  440. 16180 REM PUT NAMELOC IN LISTV
  441. 16190 LISTLEN=1
  442. 16200 LISTV(0)=NAMELOC
  443. 16210 RETURN
  444. 16500 REM COME HERE TO COLLECT A SERIES OF VARIABLES
  445. 16501 REM IF FORCE0% THEN INCLUDE CONSTANT AUTOMATICALLY
  446. 16502 IF NOT FORCE0% THEN LISTLEN=0 ELSE LISTV(0)=0:LISTLEN=1
  447. 16505 PRINT "ENTER VARIABLE NAME(S)"
  448. 16510 INPUT "SEPARATED BY A SPACE> ",ANSWER$
  449. 16520 IF ANSWER$="" THEN NAMEERR=TRUE%:RETURN
  450. 16535 FOR I=0 TO MAXVAR-1 : LAG(I)=0 : NEXT I
  451. 16540 LOOKFROM=1
  452. 16550 REM RETRIEVE A VARIABLE NAME
  453. 16560 SPACELOC%=INSTR(LOOKFROM,ANSWER$," ")
  454. 16570 IF SPACELOC%=0 THEN SPACELOC%=LEN(ANSWER$)+1
  455. 16580 NAMEIS$=MID$(ANSWER$,LOOKFROM,SPACELOC%-LOOKFROM)
  456. 16582 N1=INSTR(1,NAMEIS$,"[")
  457. 16584 IF N1<=1 THEN GOTO 16594
  458. 16590 N2=INSTR(N1,NAMEIS$,"]") : LAG$=MID$(NAMEIS$,N1+1,N2-N1-1)
  459. 16592 NAMEIS$=LEFT$(NAMEIS$,N1-1) : LG=VAL(LAG$)
  460. 16594 IF LG+NSMPL(1)<0 OR LG+NSMPL(NR2)>NUMOBS-1 THEN 16900
  461. 16597 NAMELOC=-1
  462. 16600 IF NAMEIS$="" THEN 16730
  463. 16610 IF NOT NEWNAMES THEN 16630
  464. 16620 GOSUB 15000: IF NAMEERR THEN RETURN
  465. 16630   FOR I=0 TO NUMVAR-1
  466. 16640   IF NAMES$(I)=NAMEIS$ THEN NAMELOC=I
  467. 16650   NEXT I
  468. 16660 IF NAMELOC<>-1 THEN 16700
  469. 16670 PRINT CHR$(34);NAMEIS$;CHR$(34);" NOT DEFINED"
  470. 16680 PRINT "RE-ENTER LIST OR "; : PRINT RMM$
  471. 16690 GOTO 16500
  472. 16700 REM PUT NAMELOC IN LISTV
  473. 16710 LISTV(LISTLEN)=NAMELOC : LAG(LISTLEN)=LG : LG=0
  474. 16720 LISTLEN=LISTLEN+1
  475. 16730 LOOKFROM=SPACELOC%+1
  476. 16740 IF LOOKFROM<=LEN(ANSWER$) THEN GOTO 16850
  477. 16745 L1=LISTLEN-1: IF INST THEN RETURN
  478. 16750 FOR I=0 TO L1
  479. 16760  PRNAM$(I)=NAMES$(LISTV(I))
  480. 16770  IF LAG(I)<0 THEN PRNAM$(I)=PRNAM$(I)+"["+STR$(LAG(I))+"]"
  481. 16780  IF LAG(I)>0 THEN PRNAM$(I)=PRNAM$(I)+"[+"+STR$(LAG(I))+"]"
  482. 16790 NEXT I : RETURN
  483. 16800 NAMEERR=FALSE% : LISTLEN=0 : INPUT "VARIABLE NAME IS?> ",ANSWER$
  484. 16810 GOTO 16520
  485. 16850 IF LISTLEN<MAXNAMES THEN 16560
  486. 16860 PRINT "TOO MANY NAMES"
  487. 16870 GOTO 16680
  488. 16900 PRINT "LAG OR LEAD IN ";NAMEIS$;" TAKES VARIABLE OUTSIDE DATA RANGE"
  489. 16910 GOSUB 19000 : NAMEERR=TRUE% : RETURN
  490. 18000 REM
  491. 18010 REM HANDLE A FEW ERRORS HERE
  492. 18020 REM DID WE RUN OUT OF SPACE?
  493. 18030 IF ERR<>7 AND ERR<>14 THEN 18070
  494. 18040 PRINT "PROGRAM RAN OUT OF MEMORY IN LINE ";ERL
  495. 18050 PRINT "SORRY..."
  496. 18060 STOP
  497. 18070 REM DID WE TRY TO READ FROM A NON-EXISTENT FILE?
  498. 18080 IF ERR<>53 OR NOT(ERL=8040 OR ERL=8730) THEN 18120
  499. 18090 IF FILENAME$="" THEN RESUME 8860
  500. 18100 PRINT "CAN'T FIND ";FILENAME$
  501. 18110 IF ERL=8040 THEN RESUME 8030 ELSE RESUME 8720
  502. 18120 REM IS THIS A NEW OUTPUT FILE?
  503. 18130 IF ERR<>53 OR ERL<>7065 THEN 18150
  504. 18140 RESUME NEXT
  505. 18150 IF ERR<>58 OR ERL<>7065 THEN 18200
  506. 18160 PRINT "FILE ALREADY EXISTS, ARE YOU SURE? (Y/N)";
  507. 18170 INPUT "",ANSWER$
  508. 18180 IF ANSWER$="y" OR ANSWER$="Y" THEN RESUME NEXT
  509. 18190 RESUME 7060
  510. 18200 IF ERR<>70 THEN 18230
  511. 18210 PRINT "DISK WRITE-PROTECTED - REMOVE TAB" : GOSUB 19030
  512. 18220 IF ERL=7070 THEN RESUME 7070 ELSE IF ERL=23000 THEN RESUME 22020 ELSE RESUME 8170
  513. 18230 IF ERR<>71 THEN 18270
  514. 18240 PRINT "DISK NOT AVAILABLE"
  515. 18250 PRINT "CHECK THAT DISK IS IN DRIVE AND DOOR IS CLOSED" : GOSUB 19030
  516. 18260 IF ERL=7065 THEN RESUME 7060 ELSE IF ERL=23000 THEN RESUME 22020 ELSE IF ERL=8040 THEN RESUME 8030 ELSE IF ERL=8730 THEN RESUME 8720 ELSE RESUME 8170
  517. 18270 IF ERR<>68 THEN 18280
  518. 18273 PRINT "DISK DRIVE NOT WORKING OR NON-EXISTANT" : GOSUB 19030
  519. 18276 IF ERL=7065 THEN RESUME 7060 ELSE IF ERL=23000 THEN RESUME 22020 ELSE IF ERL=8040 THEN RESUME 8030 ELSE IF ERL=8730 THEN RESUME 8720 ELSE RESUME 8170
  520. 18280 IF ERR<>61 THEN 18310
  521. 18290 PRINT "DISK FULL - CHANGE DISK"
  522. 18300 RESUME 8170
  523. 18310 IF ERR<>64 THEN 18370
  524. 18320 PRINT "BAD FILE NAME"
  525. 18325 IF ERL=8040 OR ERL=8730 THEN RESUME 8170
  526. 18330 IF ERL<>7065 AND ERL<>7070 THEN 18370
  527. 18340 PRINT "TRY  TEMP.DAT  AS NAME"
  528. 18350 RESUME 7060
  529. 18370 IF ERR<>72 THEN 18390
  530. 18380 PRINT "DISKETTE PROBABLY BAD" : RESUME 8170
  531. 18390 IF ERR<>27 THEN 18420
  532. 18400 PRINT "PRINTER NOT ON OR OUT OF PAPER" : GOSUB 19000
  533. 18410 RESUME NEXT
  534. 18420 IF ERR<>9 THEN 18450
  535. 18430 PRINT "WENT BEYOND AVAILABLE DATA"
  536. 18440 PRINT "CHECK LAGS AND SAMPLE RANGE" : RESUME 8170
  537. 18450 IF ERR<>2 THEN 18490
  538. 18460 PRINT "SYNTAX ERROR"
  539. 18470 PRINT "YOUR STATEMENT DOESN'T MAKE SENSE TO ME"
  540. 18480 RESUME 8170
  541. 18490 IF ERR<>5 OR ERL<25000 OR ERL>26000 THEN 18520
  542. 18500 PRINT "ON IBM MUST HAVE GRAPHIC MONITOR AND USE ADVANCED BASIC"
  543. 18510 GOSUB 19000 : RESUME 7160
  544. 18520 IF ERR<>6 THEN 18900
  545. 18530 PRINT "Overflow" : RESUME 7160
  546. 18900 IF ERR<>5 OR (ERL<>12505 AND ERL<>12430 AND ERL<>11180 AND ERL<>17020 AND ERL<>12460 AND ERL<>3670 AND ERL<> 26060 AND ERL<>28070) THEN 18920
  547. 18910 RESUME NEXT 'OK, WE JUST ERASED SOMETHING THAT WASNT THERE
  548. 18920 PRINT "ERROR NUMBER ";ERR;" OCCURRED IN LINE ";ERL
  549. 18930 PRINT "REPORT CIRCUMSTANCES TO PROGRAM AUTHOR" : RESUME 8170
  550. 19000 REM HOLD SCREEN
  551. 19010 LOCATE 25,1 : PRINT "HIT ANY KEY TO RETURN TO COMMAND MENU>";
  552. 19020 IF INKEY$="" THEN 19020 ELSE RETURN
  553. 19030 LOCATE 25,1 : PRINT "HIT ANY KEY TO CONTINUE>";
  554. 19040 IF INKEY$="" THEN 19040
  555. 19045 CLS: RETURN
  556. 19050 FOR I=0 TO 1000 : NEXT I : RETURN
  557. 19100 IF LP% THEN WLP%=1
  558. 19105 LP%=0 : SCR%=0 : S$=" "
  559. 19108 LOCATE 25,1 : PRINT "DO YOU WANT TO SEE THE OUTPUT REPEATED? (S, P, OR <RETURN>)  "; : INPUT "",ANSWER$
  560. 19110 LSET S$=ANSWER$
  561. 19120 IF S$="P" OR S$="p" THEN LP%=1 ELSE IF S$="S" OR S$="s" THEN SCR%=1 ELSE IF S$<>" " THEN GOTO 19100
  562. 19130 IF WLP% THEN LPRINT CHR$(PADV%) : WLP%=0
  563. 19135 RETURN
  564. 19150 IF LP% THEN WLP%=1
  565. 19155 LP%=0 : SCR%=0 : S$=" "
  566. 19158 LOCATE 25,1 : PRINT "DO YOU WANT TO SEE THE COVARIANCE MATRIX? (S, P, OR <RETURN>)"; : INPUT "",ANSWER$
  567. 19160 LSET S$=ANSWER$
  568. 19170 IF S$="P" OR S$="p" THEN LP%=1 ELSE IF S$="S" OR S$="s" THEN SCR%=1 ELSE IF S$<>" " THEN GOTO 19150
  569. 19180 RETURN
  570. 19200 SCR%=0 : LOCATE 25,1
  571. 19207 INPUT "WOULD YOU LIKE THE FORECAST GRAPHED? (Y/N)> ",ANSWER$
  572. 19210 IF ANSWER$="Y" OR ANSWER$="y" THEN SCR%=1 : RETURN
  573. 19220 IF ANSWER$="N" OR ANSWER$="n" THEN RETURN ELSE 19200
  574. 24800 PRINT SPC(4) "SAMPLE RANGE ";
  575. 24803 IF LP% THEN LPRINT "SAMPLE RANGE ";
  576. 24807 N1=1 : N2=2
  577. 24810 PRINT NSMPL(N1)+1;"-";NSMPL(N2)+1;
  578. 24820 IF LP% THEN LPRINT NSMPL(N1)+1;"-";NSMPL(N2)+1;
  579. 24830 IF N2>=NR2 THEN PRINT : RETURN
  580. 24840 N1=N1+2 : N2=N2+2 : PRINT SPC(2);
  581. 24850 IF LP% THEN LPRINT SPC(2);
  582. 24860 GOTO 24810
  583. 0 IF N2>=NR2 THEN PRINT : RETURN
  584. 24840 N1=N1+2 : N